對於一個簡單的聊天室而言,大致上只需要User資料表記錄使用者,Message資料表紀錄訊息內容、發送方使用者、接受方使用者、時間戳等等。
問題是,如果是多人聊天室,當A發一筆訊息時,聊天室有500個成員,這時Message資料表就會瞬間新增至少499筆,顯然有優化的選項。
資料庫正規化
換個角度想,把要發送的對象抽出來,由另外一張表負責記錄聊天室的成員。這樣一來,不管訊息新增幾筆,Message資料表只需要記住是哪一個聊天室Id,便可以知道該發送給誰。
也就是資料庫正規化的第二級原則。
*上圖的Message資料表,我先省略"發送方使用者"的欄位及關連,讓圖示更清楚些。
在設計資料庫時,正規化的原則可以增進資料庫效能、減少儲存記憶體浪費。
正規化有三個階段:
(1) 第一級正規化
1.消除每個資料表中同類型的欄位
(例如: Message資料表有兩個欄位-接受者1、接受者2,合併成接受者一個欄位)
2.使用一個**主鍵值(PK)**來識別每一筆資料
(例如: Message資料表有Id,跟身分證一樣,可以區分不同筆資料)
(2) 第二級正規化
1.會重複出現的欄位資料,拆分獨立的資料表
2.透過一個外來鍵值(Foreign key)來關聯這些資料表的資料
(3) 第三級正規化
1.消除與主鍵無關的欄位
(例如: Message表有使用者資訊UserPhone,很容易在資料異動時出錯)
2.**消除遞移關係**
( X->Y,Y->Z 所以X->Z。例如: 總金額 = 商品單價* 數量,
這時可能不適合把總金額欄位和數量放在同一張表,
數量異動時可能會造成總金額錯誤)
正規化就是減少資料重複、減少資料錯誤,但同時會造成查詢變複雜(需要JOIN),所以依照需求和資料量設計資料庫才是王道。